﻿#include<iostream>
using namespace std;

//class Person {
//public:
//	virtual void Identity() {
//		cout << "Person" << endl;
//	}
//protected:
//	int _id;
//};

//class Animal {
//public:
//	virtual void MakeSound() {
//		cout << "Animal:" << endl;
//	}
//};
//
//class Cat : public Animal {
//public:
//	virtual void MakeSound() {
//		cout << "Cat: 喵喵" << endl;
//	}
//};
//
//class Dog : public Animal {
//public:
//	 void MakeSound() {
//		cout << "Dog: 汪汪" << endl;
//	}
//};
//
//class Duck : public Animal {
//public:
//	 void MakeSound() {
//		cout << "Duck: 嘎嘎" << endl;
//	}
//};
//
//void testMakeSound(Animal* animal) {
//	animal->MakeSound();
//}
//
//void testMakeSound(Animal& animal) {
//	animal.MakeSound();
//}
//
//
//int main() {
//	Animal ani;
//	Cat cat;
//	Dog dog;
//	Duck duck;
//
//	testMakeSound(ani);
//	testMakeSound(cat);
//	testMakeSound(dog);  
//	testMakeSound(duck); 
//	return 0;
//}

//class A{
//public:
//	virtual void func(int val = 1) { std::cout << "A->" << val << std::endl; }
//	virtual void test() { func(); }
//};
//
//class B : public A{
//public:
//	void func(int val = 0) { std::cout << "B->" << val << std::endl; }
//};
//
//int main(){
//	B* p = new B;
//	p->test();
//	return 0;
//}


//协变
//class A {
//public:
//	void Test() {
//		cout << "A" << endl;
//	}
//};
//
//class B : public A {
//public:
//	void Test() {
//		cout << "B" << endl;
//	}
//};
//
//class Person {
//public:
//	virtual A* BuyTickes() {
//		cout << "买票 —— 全价" << endl;
//	}
//};
//
//class Student : public Person {
//public:
//	virtual B* BuyTicket() 
//	{
//		cout << "买票-打折" << endl;
//		return nullptr;
//	}
//};



//class A {
//public:
//	virtual void Test() {
//		cout << "A" << endl;
//	}
//
//	virtual ~A(){
//		cout << "~A" << endl;
//	}
//protected:
//	int _a;
//};
//
//class B : public A {
//public:
//	virtual void Test() {
//		cout << "B" << endl;
//	}
//	virtual ~B() {
//		cout << "~B" << endl;
//		delete[] _ptr;
//	}
//protected:
//	int* _ptr = new int[10];
//};
//
//int main() {
//
//	A* p1 = new A;
//	A* p2 = new B;
//
//	delete p1;
//	delete p2;
//
//	return 0;
//}



//class A {
//public:
//	virtual void Test() {
//		cout << "A" << endl;
//	}
//};
//
//class B : public A {
//public:
//	virtual void Tset() override{
//		cout << "B" << endl;
//	}
//};
//
//int main() {
//	A* p1 = new A;
//	A* p2 = new B;
//
//	p1->Test();
//	p2->Test();
//	return 0;
//}


//纯虚函数

//class Car {
//public:
//	virtual void Drive() = 0;
//};
//
//class Benz : public Car{
//public:
//	
//};
//
//class BMW : public Car{
//public:
//	
//};
//
//int main() {
//	//Car car;
//
//	Car* pbenz = new Benz;
//	Car* pbmw = new BMW;
//
//	pbenz->Drive();
//	pbmw->Drive();
//	return 0;
//}

//class Base
//{
//public:
//	virtual void Func1(){
//		cout << "Func1()" << endl;
//	}
//	virtual void Func2(){
//		cout << "Func2()" << endl;
//	}
//	virtual void Func3(){
//		cout << "Func3()" << endl;
//	}
//	void Func(){
//		cout << "Func()" << endl;
//	}
//protected:
//	int _b = 1;
//	char _ch = 'x';
//};
//int main()
//{
//	Base b;
//	cout << sizeof(b) << endl;
//	return 0;
//}


class Person {
public:
	virtual void BuyTicket() {
		cout << "买票——全价" << endl;
	}

	virtual void func1() {
		cout << "func1" << endl;
	}
};
class Student : public Person {
public:
	virtual void BuyTicket() {
		cout << "买票——打折" << endl;
	}

	virtual void StuTest() {
		cout << "StuTest" << endl;
	}

	void tst() {
		cout << "hh" << endl;
	}
};
int main() {
	Person per;
	Student stu;
	return 0;
}

